public class ScoreManager {
    private Student[] students = new Student[10];  // 最多存10个学生
    private Course[] courses = new Course[10];    // 最多存10门课程
    private Score[] scores = new Score[10];      // 最多存10条成绩
    private int studentCount = 0;  // 记录实际学生数量
    private int courseCount = 0;   // 记录实际课程数量
    private int scoreCount = 0;    // 记录实际成绩数量

    // 1. 添加学生
    public void addStudent(Student student) {
        if (studentCount < students.length) {
            students[studentCount] = student;
            studentCount++;
            System.out.println("添加学生成功：" + student.getName());
        } else {
            System.out.println("学生数量已满，无法添加！");
        }
    }

    // 2. 添加课程
    public void addCourse(Course course) {
        if (courseCount < courses.length) {
            courses[courseCount] = course;
            courseCount++;
            System.out.println("添加课程成功：" + course.getCourseName());
        } else {
            System.out.println("课程数量已满，无法添加！");
        }
    }

    // 3. 添加成绩
    public void addScore(Student student, Course course, double score) {
        if (scoreCount < scores.length) {
            try {
                scores[scoreCount] = new Score(student, course, score);
                scoreCount++;
                System.out.println("添加成绩成功：" + student.getName() + "-" + course.getCourseName() + "：" + score + "分");
            } catch (ScoreException e) {
                System.out.println("添加成绩失败：" + e.getMessage());
            }
        } else {
            System.out.println("成绩数量已满，无法添加！");
        }
    }

    // 4. 查询成绩（根据学号+课程号）
    public double queryScore(String studentId, String courseId) {
        // 循环遍历成绩数组（基础for循环，无增强for）
        for (int i = 0; i < scoreCount; i++) {
            Score s = scores[i];
            if (s.getStudent().getStudentId().equals(studentId) && s.getCourse().getCourseId().equals(courseId)) {
                return s.getScore();
            }
        }
        return -1; // 返回-1表示未找到
    }

    // 5. 计算GPA（学分加权）
    public double calculateGPA(String studentId) {
        double totalGradePoints = 0.0; // 总绩点
        int totalCredits = 0;          // 总学分

        // 循环遍历成绩数组
        for (int i = 0; i < scoreCount; i++) {
            Score s = scores[i];
            if (s.getStudent().getStudentId().equals(studentId)) {
                Course course = s.getCourse();
                double score = s.getScore();
                int credit = course.getCredit();
                totalCredits += credit;

                // 绩点规则（简单直观）
                if (score >= 90) {
                    totalGradePoints += credit * 4.0;
                } else if (score >= 80) {
                    totalGradePoints += credit * 3.0;
                } else if (score >= 70) {
                    totalGradePoints += credit * 2.0;
                } else if (score >= 60) {
                    totalGradePoints += credit * 1.0;
                }
                // 60以下绩点0，不用算
            }
        }

        // 避免除数为0（无成绩时GPA为0）
        return totalCredits == 0 ? 0.0 : totalGradePoints / totalCredits;
    }

    // 主方法：测试所有功能（直接运行）
    public static void main(String[] args) {
        ScoreManager manager = new ScoreManager();

        // 步骤1：添加学生
        System.out.println("=== 1. 添加学生 ===");
        Student s1 = new Student("S001", "张三", "计算机2301班");
        Student s2 = new Student("S002", "李四", "计算机2302班");
        manager.addStudent(s1);
        manager.addStudent(s2);

        // 步骤2：添加课程
        System.out.println("\n=== 2. 添加课程 ===");
        Course c1 = new Course("C001", "Java编程", 4);
        Course c2 = new Course("C002", "数据库", 3);
        manager.addCourse(c1);
        manager.addCourse(c2);

        // 步骤3：添加成绩（含非法分数测试）
        System.out.println("\n=== 3. 添加成绩 ===");
        manager.addScore(s1, c1, 85);   // 合法
        manager.addScore(s1, c2, 92);   // 合法
        manager.addScore(s2, c1, 58);   // 合法
        manager.addScore(s2, c2, 105);  // 非法（105分）
        manager.addScore(s1, c1, -2);   // 非法（负分）

        // 步骤4：查询成绩
        System.out.println("\n=== 4. 查询成绩 ===");
        double zhangsanJava = manager.queryScore("S001", "C001");
        if (zhangsanJava != -1) {
            System.out.println("张三的Java编程成绩：" + zhangsanJava + "分");
        } else {
            System.out.println("张三的Java编程成绩：未找到");
        }

        double lisiDb = manager.queryScore("S002", "C002");
        if (lisiDb != -1) {
            System.out.println("李四的数据库成绩：" + lisiDb + "分");
        } else {
            System.out.println("李四的数据库成绩：未找到");
        }

        // 步骤5：计算GPA
        System.out.println("\n=== 5. 计算GPA ===");
        System.out.println("张三的GPA：" + String.format("%.2f", manager.calculateGPA("S001"))); // 3.57
        System.out.println("李四的GPA：" + String.format("%.2f", manager.calculateGPA("S002"))); // 0.00
    }
}
